package com.browsesoft.parameter;

import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.browsesoft.dbtools.DBTools;

/**
 * 参数
 */
public class Parameter {
	/**
	 * 预存参数
	 */
	private static Map parameters = new HashMap();

	/**
	 * 存放属性值 参数ID,参数名称
	 */
	private Hashtable attributes = new Hashtable();

	/**
	 * 预存参数值
	 */
	private Map codeAndValues = null;

	/**
	 * 默认构造
	 */
	public Parameter() {
	}

	public Parameter(String paramName) {
		try {
			// 生成参数
			String[][] param = DBTools
					.executeQueryWithTableHead("select * from t_parameter where name='"
							+ paramName + "'");
			attributes = DBTools.getAttributes(param, 1);
		} catch (Exception e) {
			System.out.println("参数:" + paramName + "错误");
		}
	}

	/**
	 * 得到参数
	 */
	public void getParameters(String id) throws Exception {
		// 生成参数
		String[][] param = DBTools
				.executeQueryWithTableHead("select * from t_parameter where id='"
						+ id + "'");
		if (param.length > 1) {
			attributes = DBTools.getAttributes(param, 1);
		}

	}

	/**
	 * 删除
	 */
	public void delete() throws Exception {
		String id = (String) this.getAttributes().get("id");
		String sql = "delete from t_parameter where id='" + id + "'";
		DBTools.excuteUpdate(sql);
	}

	/**
	 * 得到参数属性
	 * 
	 * @return 属性
	 */
	public Hashtable getAttributes() {
		return this.attributes;
	}

	/**
	 * 得到参数值
	 * 
	 * @throws Exception
	 * @return paramValues
	 */
	public LinkedList getParamValues() throws Exception {
		String paramid = attributes.get("id").toString();
		String[][] paramValue = DBTools
				.executeQueryWithTableHead("select * from t_paramvalue where processid='"
						+ paramid + "'");
		LinkedList paramValues = new LinkedList();
		for (int i = 1; i < paramValue.length; i++) {
			ParameterValue p = new ParameterValue(DBTools.getAttributes(
					paramValue, i));
			paramValues.addLast(p);
		}
		return paramValues;
	}
	
	public List getParamForRest() throws Exception{
		String paramid = attributes.get("id").toString();
		String[][] paramValue = DBTools
				.executeQueryWithTableHead("select * from t_paramvalue where processid='"
						+ paramid + "'");
		List list = DBTools.arrayToHashtable(paramValue);
		return list;
	}

	/**
	 * 得到参数名
	 */
	public String getName() {
		return (String) this.attributes.get("name");
	}

	/**
	 * 从预存中得参数值，不考虑变化
	 * 
	 * @param code
	 * @return
	 */
	public ParameterValue getParamValueFromBuffer(String code) {
		try {
			// 如果没有预存
			if (this.codeAndValues == null) {
				// 装载参数
				this.codeAndValues = this.ValuesToMap(this.getParamValues());
			}
			return (ParameterValue) this.codeAndValues.get(code);
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}

	/**
	 * 把参数值列表转换成以code为主键的hashmap
	 */
	private Map ValuesToMap(Collection values) {
		Map result = new HashMap();
		// 对于每一个参数值
		Iterator iter = values.iterator();
		while (iter.hasNext()) {
			ParameterValue item = (ParameterValue) iter.next();
			// 将以code为主键的内容添加到结果中
			result.put((String) item.getAttributes().get("code"), item);
		}
		return result;
	}

	/**
	 * 根据参数值代码得到参数值
	 * 
	 * @param code
	 *            参数值代码
	 * @return 参数值
	 */
	public ParameterValue getParamValue(String code) {
		try {
			// 根据参数id及参数值code得到数据
			String paramid = (String) attributes.get("id");
			String[][] paramValue = DBTools
					.executeQueryWithTableHead("select *"
							+ " from t_paramvalue where processid=" + paramid
							+ " and code='" + code + "'");
			// 如果没取到
			if (paramValue.length < 2) {
				throw new RuntimeException("取参数值错误，参数名:" + this.getName()
						+ "，参数值代码:" + code);
			}
			ParameterValue p = new ParameterValue(DBTools.getAttributes(
					paramValue, 1));
			return p;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 根据参数名称得参数
	 */
	public static Parameter getParameter(String name) {
		// 从预存中得
		Parameter result = (Parameter) parameters.get(name);
		// 如果没有找到
		if (result == null) {
			// 重新建立
			result = new Parameter(name);
			// 放到预存中
			parameters.put(name, result);
		}
		return result;
	}
}